package ice.dao.util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * DBUtil
 * 
 * @author abiao
 */
public abstract class DBUtil {

    /**
     * 预编译SQL语句池
     */
    private Map<String, PreparedStatement> stmtMap = new HashMap<String, PreparedStatement>();

    /**
     * 空参
     */
    private static final Object[] NON_PARAMS = null;

    /**
     * 获取内存库实例
     */
    public static DBUtil getMemDB() {
        return MemDB.initDB();
    }

    /**
     * 获取实体库
     */
    public static DBUtil getEntityDB() {
        return EntityDB.initDB();
    }

    /**
     * 生成预处理SQL语句
     */
    protected PreparedStatement getPrepStmt(Connection conn, String sql) throws Exception {
        if (!stmtMap.containsKey(sql)) {
            if (conn != null) {
                stmtMap.put(sql, conn.prepareStatement(sql));
            }
        }
        return stmtMap.get(sql);
    }

    /**
     * 生成预处理SQL语句
     */
    protected PreparedStatement getPrepStmt(String sql) throws Exception {
        return getPrepStmt(getConnection(), sql);
    }

    /**
     * 获取SQL连接
     */
    protected abstract Connection getConnection() throws Exception;

    /**
     * 结果集查询
     */
    public List<TableRow> query(String sql) {
        return query(sql, NON_PARAMS);
    }

    /**
     * 结果集查询
     */
    public abstract List<TableRow> query(String sql, Object[] params);

    /**
     * 单条记录查询
     */
    public TableRow queryRow(String sql) {
        return queryRow(sql, NON_PARAMS);
    }

    /**
     * 单条记录查询
     */
    public TableRow queryRow(String sql, Object[] params) {
        List<TableRow> result = query(sql, params);
        if (result.isEmpty()) {
            return null;
        }
        return result.get(0);
    }

    /**
     * 以列序为key的结果集
     */
    public List<TableRow> queryForIndex(String sql) {
        return queryForIndex(sql, NON_PARAMS);
    }

    /**
     * 以列序为key的结果集
     */
    public abstract List<TableRow> queryForIndex(String sql, Object[] params);

    /**
     * 数据更新
     */
    public void update(String sql) throws Exception {
        update(sql, NON_PARAMS);
    }

    /**
     * 数据更新
     */
    public abstract void update(String sql, Object[] params) throws Exception;

    /**
     * 批量更新
     */
    public abstract void batchUpdate(List<SqlObject> sqlObList) throws Exception;
}
